package enlace;

import java.math.BigInteger;
import java.util.ArrayList;

/*
 * Esta estrategia de entramado divide al paquete en n tramas, y a cada trama le agrega
 * banderas de fin y de inicio, y aplica relleno de bits en el payload.
 */
public class EstrategiaEntramadoBanderasConRellenoDeBits extends EstrategiaEntramado {

	public ArrayList<Trama> obtenerTramas(Paquete paquete) {
		System.out.println("[Capa de enlace] Entramador: La estrategia utilizada es banderas de inicio y fin, con relleno de bits");
		String contenidoPaqueteRellenado = rellenar(paquete);
		ArrayList<Trama> tramas = convertirEnTramas(contenidoPaqueteRellenado);
		agregarBanderasATramas(tramas);
		return tramas;
	}

	private String rellenar(Paquete paquete) {
		String contenido = CapaEnlaceUtils.convertirStringABits(paquete.getContenido());
		contenido.replaceAll("11111", "111110");
		return contenido;
	}

	private ArrayList<Trama> convertirEnTramas(String contenidoPaqueteRellenado) {
		ArrayList<Trama> tramas = new ArrayList<Trama>();
		int longitudTrama = (int)Math.floor(contenidoPaqueteRellenado.length() / FachadaCapaEnlaceParaCapaDeRed.CANTIDAD_TRAMAS);
		for (int i = 0; i <= FachadaCapaEnlaceParaCapaDeRed.CANTIDAD_TRAMAS; i++) {
			Trama trama = new Trama();
			int inicioTrama = i * longitudTrama;
			int finTrama = (i * longitudTrama) + longitudTrama < contenidoPaqueteRellenado
					.length() ? (i * longitudTrama) + longitudTrama : contenidoPaqueteRellenado
					.length();
			trama.setPayload(contenidoPaqueteRellenado.substring(inicioTrama, finTrama));
			if (trama.getPayload().length() != 0) {
				System.out.println("[Capa de enlace] Entramador: Trama " + i + " - " + trama.getPayload());
				tramas.add(trama);
			}
		}
		return tramas;
	}

	private void agregarBanderasATramas(ArrayList<Trama> tramas) {
		for(Trama trama : tramas){
			trama.setEncabezado("01111110");
			trama.setTerminador("01111110");
		}
		System.out.println("[Capa de enlace] Entramador: Banderas de inicio y de fin agregadas a cada trama");
	}
}